home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / games / km21 / src / trlib.c < prev    next >
C/C++ Source or Header  |  1999-12-05  |  9KB  |  497 lines

  1. /*
  2. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3.  
  4.     トランプドライバ用ライブラリ
  5.  
  6.                     by 電魔団\shoryu 1993
  7.  
  8. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  9. */
  10. //スーパーバイザで使用するよう改良
  11. //#define    LIBTEST
  12.  
  13.  
  14. extern    int    _tr_put();
  15. extern    int    _tr_put_lh();
  16. extern    int    _tr_put_lq();
  17. extern    int    _tr_put_rh();
  18. extern    int    _tr_put_rq();
  19. extern    int    _tr_put_uh();
  20. extern    int    _tr_put_uq();
  21. extern    int    _tr_put_dh();
  22. extern    int    _tr_put_dq();
  23.  
  24.  
  25.  
  26. short    *TrumpPatternBuffer=-1;        //誰も使わないような名前で最初は -1 が入っている
  27.  
  28. /*
  29.     NULデバイスのデバイスヘッダのアドレスをかえす
  30.  
  31.     戻り値:
  32.         NULデバイスのデバイスヘッダのトップアドレス
  33. */
  34. int    *GetNulDeviceHeader(void)
  35. {
  36.     char    NULhead[4+1]="NUL ";        // \x00がじゃまやんこいやぁ
  37.     short    NULattr=0x8024;            // NULデバイスのアトリビュート
  38.     int    *NULvar;            // 'NUL 'の値を指すアドレス
  39.     short    *NULaddr;            // 'NUL 'を探しているアドレス
  40. //    int    ssp;
  41.     char    *addr;
  42.     int    *saddr;
  43.     
  44.     
  45.     /*
  46.     !    NULデバイスのサーチ
  47.     */
  48. //    ssp=B_SUPER(0);
  49.     NULaddr=(short *)0x6800;        // Human 68K のトップアドレス
  50.     NULvar=NULhead;
  51.     while(1){                //NULデバイスがみつからないことはまずない
  52.         if( *(int *)NULaddr==*NULvar ){    //とりあえず 'NUL' を発見したか?
  53.             /*
  54.             !    デバイス名の前10バイトめのところにアトリビュートがある
  55.             */
  56.             if( *(NULaddr-10/sizeof(short))==NULattr ){
  57.                 break;
  58.             }
  59.         }
  60.         else{
  61.             NULaddr++;        // 'NUL'が奇数番地にくることはない
  62.         }
  63.     }
  64. //    B_SUPER(ssp);
  65.     
  66.     /*
  67.     !    デバイスチェインをかけあがる
  68.     */
  69.     saddr=NULaddr-14/sizeof(short);        //一番最初のリンクポインタ(名前のところから14バイト前にある)を得る
  70.  
  71.     return( saddr );
  72. }
  73.  
  74.  
  75.  
  76. /*
  77.     トランプドライバの常駐チェック
  78.  
  79.     戻り値:
  80.         常駐している :デバイスヘッダが格納されているアドレス
  81.         常駐していない:-1
  82. */
  83. int    CheckKeep()
  84. {
  85. //    int    ssp;
  86.     int    *saddr,*daddr;
  87.     int    *device_name;
  88.     char    *device_name_buf="TRDRV/*-";    // デバイス名(ファイル名としてアクセスできないもの)
  89.     
  90.     device_name=device_name_buf;
  91.     saddr=GetNulDeviceHeader();
  92.     
  93.     /*
  94.     !    デバイスチェインをかけあがり、すでに常駐している自分自身のデバイスヘッダを探す
  95.     */
  96. //    ssp=B_SUPER(0);
  97.     while( saddr!=-1 ){
  98.         
  99.         if( *(int *)((char *)saddr+14) == device_name[0] && *(int *)((char *)saddr+18) == device_name[1] ){
  100.             break;        //常駐しているドライバのデバイスヘッダを見つけた
  101.         }
  102.         saddr=*saddr;    //ネクストリンクを得る
  103.         
  104.     }
  105. //    B_SUPER(ssp);
  106.     
  107.     return(saddr);
  108. }
  109.  
  110.  
  111.  
  112.  
  113. /*
  114.     トランプデータ出力関数
  115.  
  116.     引数:
  117.         int    px,py,cmnm;
  118.             px    X座標
  119.             py    Y座標
  120.             cnum    カード番号
  121.  
  122.     戻り値:
  123.          0:
  124.         -1:座標指定違反
  125. */
  126. int    TR_PUT(px,py,cnum)
  127. int    px,py,cnum;
  128. {
  129. #define        CSIZE    8192
  130.     int    res;
  131.     int    ssp;
  132.     
  133.     if( TrumpPatternBuffer==-1 ){
  134.         TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
  135.     }
  136.     
  137.     if( px>=0 && px<=512-64 && py>=0 && py<=512-128 ){
  138.         _tr_put(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  139.         res=0;
  140.     }
  141.     else{
  142.         res=-1;
  143.     }
  144.     return(res);
  145. #undef        CSIZE
  146. }
  147.  
  148.  
  149.  
  150. /*
  151.     左半分だけ表示する(隠れるのが前提のデータ表示部分で速度を稼ぐ)
  152. */
  153. int    TR_PUT_LH(px,py,cnum)
  154. int    px,py,cnum;
  155. {
  156. #define        CSIZE    8192
  157.     int    res;
  158.     
  159.     if( TrumpPatternBuffer==-1 ){
  160.         TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
  161.     }
  162.     
  163.     if( px>=0 && px<=512-32 && py>=0 && py<=512-128 ){
  164.         _tr_put_lh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  165.         res=0;
  166.     }
  167.     else{
  168.         res=-1;
  169.     }
  170.     return(res);
  171. #undef        CSIZE
  172. }
  173.  
  174.  
  175.  
  176. /*
  177.     左1/4だけ表示する
  178. */
  179. int    TR_PUT_LQ(px,py,cnum)
  180. int    px,py,cnum;
  181. {
  182. #define        CSIZE    8192
  183.     int    res;
  184.     
  185.     if( TrumpPatternBuffer==-1 ){
  186.         TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
  187.     }
  188.     
  189.     if( px>=0 && px<=512-16 && py>=0 && py<=512-128 ){
  190.         _tr_put_lq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  191.         res=0;
  192.     }
  193.     else{
  194.         res=-1;
  195.     }
  196.     return(res);
  197. #undef        CSIZE
  198. }
  199.  
  200.  
  201.  
  202. /*
  203.     右半分だけ表示する(カット&ペーストしたのがばればれ)
  204. */
  205. int    TR_PUT_RH(px,py,cnum)
  206. int    px,py,cnum;
  207. {
  208. #define        CSIZE    8192
  209.     int    res;
  210.     
  211.     if( TrumpPatternBuffer==-1 ){
  212.         TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
  213.     }
  214.     
  215.     if( px>=0 && px<=512-32 && py>=0 && py<=512-128 ){
  216.         _tr_put_rh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  217.         res=0;
  218.     }
  219.     else{
  220.         res=-1;
  221.     }
  222.     return(res);
  223. #undef        CSIZE
  224. }
  225.  
  226.  
  227.  
  228. /*
  229.     右1/4だけ表示する
  230. */
  231. int    TR_PUT_RQ(px,py,cnum)
  232. int    px,py,cnum;
  233. {
  234. #define        CSIZE    8192
  235.     int    res;
  236.     
  237.     if( TrumpPatternBuffer==-1 ){
  238.         TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
  239.     }
  240.     
  241.     if( px>=0 && px<=512-16 && py>=0 && py<=512-128 ){
  242.         _tr_put_rq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  243.         res=0;
  244.     }
  245.     else{
  246.         res=-1;
  247.     }
  248.     return(res);
  249. #undef        CSIZE
  250. }
  251.  
  252.  
  253.  
  254. /*
  255.     上半分だけ表示する    (追加:93-10)
  256. */
  257. int
  258. TR_PUT_UH(px,py,cnum)
  259. int    px,py,cnum;
  260. {
  261. #define        CSIZE    8192
  262.     int    res;
  263.  
  264.     if (TrumpPatternBuffer == -1) {
  265.         TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
  266.     }
  267.  
  268.     if (px>=0 && px<=512-64 && py>=0 && py<=512-64) {
  269.         _tr_put_uh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  270.         res = 0;
  271.     } else {
  272.         res = -1;
  273.     }
  274.     return (res);
  275. #undef        CSIZE
  276. }
  277.  
  278.  
  279.  
  280. /*
  281.     下半分だけ表示する    (追加:93-10)
  282. */
  283. int
  284. TR_PUT_DH(px,py,cnum)
  285. int    px,py,cnum;
  286. {
  287. #define        CSIZE    8192
  288.     int    res;
  289.  
  290.     if (TrumpPatternBuffer == -1) {
  291.         TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
  292.     }
  293.  
  294.     if (px>=0 && px<=512-64 && py>=0 && py<=512-64) {
  295.         _tr_put_dh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  296.         res = 0;
  297.     } else {
  298.         res = -1;
  299.     }
  300.     return (res);
  301. #undef        CSIZE
  302. }
  303.  
  304.  
  305.  
  306. /*
  307.     上4分の1だけ表示する    (追加:93-10)
  308. */
  309. int
  310. TR_PUT_UQ(px,py,cnum)
  311. int    px,py,cnum;
  312. {
  313. #define        CSIZE    8192
  314.     int    res;
  315.  
  316.     if (TrumpPatternBuffer == -1) {
  317.         TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
  318.     }
  319.  
  320.     if (px>=0 && px<=512-64 && py>=0 && py<=512-32) {
  321.         _tr_put_uq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  322.         res = 0;
  323.     } else {
  324.         res = -1;
  325.     }
  326.     return (res);
  327. #undef        CSIZE
  328. }
  329.  
  330.  
  331.  
  332. /*
  333.     下4分の1だけ表示する    (追加:93-10)
  334. */
  335. int
  336. TR_PUT_DQ(px,py,cnum)
  337. int    px,py,cnum;
  338. {
  339. #define        CSIZE    8192
  340.     int    res;
  341.  
  342.     if (TrumpPatternBuffer == -1) {
  343.         TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
  344.     }
  345.  
  346.     if (px>=0 && px<=512-64 && py>=0 && py<=512-32) {
  347.         _tr_put_dq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
  348.         res = 0;
  349.     } else {
  350.         res = -1;
  351.     }
  352.     return (res);
  353. #undef        CSIZE
  354. }
  355.  
  356.  
  357.  
  358. /*
  359.     カード判定用関数
  360.  
  361.     引き数:
  362.         カード番号:1~54
  363.     戻り値:
  364.         1:調べたスーツに一致
  365.         0:違う
  366. */
  367.  
  368.  
  369. //スペードのカードか?(Yes=1/No=0)
  370. int    isSPADE(cnum)
  371. int    cnum;        //カード番号
  372. {
  373.     return( (cnum>=1&&cnum<=13)?1:0 );
  374. }
  375.  
  376.  
  377. //ハートか?
  378. int    isHEART(cnum)
  379. int    cnum;
  380. {
  381.     return( (cnum>=14&&cnum<=26)?1:0 );
  382. }
  383.  
  384.  
  385. //ダイアか?
  386. int    isDIAMOND(cnum)
  387. int    cnum;
  388. {
  389.     return( (cnum>=27&&cnum<=39)?1:0 );
  390. }
  391.  
  392.  
  393. //ジャックか?
  394. int    isJACK(cnum)
  395. int    cnum;
  396. {
  397.     return( (cnum>=40&&cnum<=52)?1:0 );
  398. }
  399.  
  400.  
  401. //ばばか?
  402. int    isJOKER(cnum)
  403. int    cnum;
  404. {
  405.     return( (cnum>=53&&cnum<=54)?1:0 );
  406. }
  407.  
  408.  
  409. /*
  410.     カード数値判定
  411.  
  412.     戻り値:
  413.         普通のカード    :1~13
  414.         ばば        :0
  415. */
  416. int    TR_VAR(cnum)
  417. int    cnum;        //カード番号
  418. {
  419.     return( (cnum==53||cnum==54)?0:(cnum%13)?:13 );
  420. }
  421.  
  422.  
  423.  
  424. #ifdef    LIBTEST
  425. void    main()  //テスト用
  426. {
  427.     int     cn;
  428.  
  429.     screen(1,3,1,1);
  430.     for( cn=0;cn<=26;cn++ ){    //ノーマル
  431.         TR_PUT(cn*16,0,cn);
  432.     }
  433.     for( cn=27;cn<=54;cn++ ){
  434.         TR_PUT((cn-26)*16,128,cn);
  435.     }
  436.     for( cn=0;cn<=26;cn++ ){    //ハーフ
  437.         TR_PUT_LH(cn*16,256,cn);
  438.     }
  439.     for( cn=27;cn<=54;cn++ ){
  440.         TR_PUT_LH((cn-26)*16,384,cn);
  441.     }
  442.     getch();
  443.     screen(1,3,1,1);
  444.     for( cn=0;cn<=26;cn++ ){    //クオーター
  445.         TR_PUT_LQ(cn*16,0,cn);
  446.     }
  447.     for( cn=27;cn<=54;cn++ ){
  448.         TR_PUT_LQ((cn-26)*16,128,cn);
  449.     }
  450.  
  451.     getch();
  452.     screen(1,3,1,1);
  453.     for( cn=0;cn<=26;cn++ ){    //ライトハーフ
  454.         TR_PUT_RH(cn*16,0,cn);
  455.     }
  456.     for( cn=27;cn<=54;cn++ ){
  457.         TR_PUT_RH((cn-26)*16,128,cn);
  458.     }
  459.     for( cn=0;cn<=26;cn++ ){    //ライトクオーター
  460.         TR_PUT_RQ(cn*16,256,cn);
  461.     }
  462.     for( cn=27;cn<=54;cn++ ){
  463.         TR_PUT_RQ((cn-26)*16,384,cn);
  464.     }
  465.  
  466.     getch();
  467.     screen(1,3,1,1);
  468.     for( cn=0;cn<=26;cn++ ){    //バリューチェック
  469.         TR_PUT(cn*16,0,cn);
  470.         printf("%d \n",TR_VAR(cn));
  471.         getch();
  472.     }
  473.     for( cn=27;cn<=54;cn++ ){
  474.         TR_PUT((cn-26)*16,128,cn);
  475.         printf("%d \n",TR_VAR(cn));
  476.         getch();
  477.     }
  478.  
  479.     getch();
  480.     screen(1,3,1,1);
  481.     for( cn=0;cn<=26;cn++ ){    //スーツチェック
  482.         TR_PUT(cn*16,0,cn);
  483.         printf("%d%d%d%d%d \n",isSPADE(cn),isHEART(cn),isDIAMOND(cn),isJACK(cn),isJOKER(cn));
  484.         getch();
  485.     }
  486.     for( cn=27;cn<=54;cn++ ){
  487.         TR_PUT((cn-26)*16,128,cn);
  488.         printf("%d%d%d%d%d \n",isSPADE(cn),isHEART(cn),isDIAMOND(cn),isJACK(cn),isJOKER(cn));
  489.         getch();
  490.     }
  491.  
  492. }
  493. #endif
  494.  
  495. /* [ EOF ] */
  496.  
  497.